from django.core import paginator
from django.core.paginator import PageNotAnInteger, EmptyPage
from django.db.models import F
from django.http import HttpResponse, JsonResponse
from django.shortcuts import render

from commodity.models import Types, CommodityInfos


# Create your views here.
def commodityView(request):
    '''
    商品列表视图函数
        支持排序分类。搜索
        实现分页
    '''
    title='商品列表'
    #页面分类标识
    classContent='commoditys'
    #生成商品分类列表，为一级分类去重
    firsts=Types.objects.values('firsts').distinct()
    #查询Types所有数据
    typesList=Types.objects.all()
    #获取请求参数
    #t:分类id筛选商品类型，擦汗寻某个分页的商品信息
    t=request.GET.get('t','')
    s=request.GET.get('s','sold')
    p=request.GET.get('p',1)
    n=request.GET.get('n','')
    #初始化一个商品查询集
    commodityInfos=CommodityInfos.objects.all()
    #通过判断n t s 是否为空，决定commodityInfos是否添加相应的查询条件
    #每执行一次查询，查询结果给commodityInfos，覆盖上一次的查询结果
    #目的是让 t n s对应的查询结果能相互兼容
    if t:
        types=Types.objects.filter(id=t).first()
        commodityInfos=commodityInfos.filter(types=types.seconds)
    if s:
        #根据指定字段排序，添加负号表示降序
        commodityInfos=commodityInfos.order_by('-' + s)
    if n:
        #根据关键字进行模糊搜索商品名
        commodityInfos=commodityInfos.filter(name__contains=n)
    #分页处理
    #每页显示六条信息，如果参数p的值不是整数，那么默认返回第一页商品信息
    #如果参数p的值大于总页数，那么默认返回最后一个商品信息
    try:
        pages=paginator.page(p)
    except PageNotAnInteger:
        pages=paginator.page(1)
    except EmptyPage:
        pages=paginator.page(paginator.num_pages)
    return render(request, 'commodity.html', locals())

def detailView(request):
    title='商品介绍'
    classContent='details'
    #查询了除了当前商品外的五个前五个商品
    items=CommodityInfos.objects.exclude(id=id).order_by('-sold')[:5]
    #查询id的商品如果没有就返回None
    commoditys=CommodityInfos.objects.filter(id=id).first()
    #从Session中获取用户收藏列表
    likesList=request.session.get('likes',[])
    #判断当前用户是否被收藏
    likes=True if id in likesList else False
    return render(request, 'details.html', locals())
def collectView(request):
    """
    商品收藏试图(AJAX接口)
    更新商品收藏的数量
    记录用户收藏状态到session
    -处理
    """
    #id代表当前商品的逐渐id
    id=request.GET.get('id','')
    #设置响应内容result,以字典形式表示
    result={'result':"已收藏"}
    #从请求对象request中获取会话session数据lkes
    likes=request.session.get('likes',[])
    #如果变量id不为空，并且变量id不在likes中，那么说明当前商品
    #还没有被加入收藏，程序将执行收藏操作
    if id and not int(id) in likes:
        CommodityInfos.objects.filter(id=id).update(likes=F('likes') + 1)
        result["result"]="收藏成功"
        #最后，将当前商品的id写入绘画session数据likes，标记当前上货品已经内用户收藏了
        request.session['likes']=likes+[int(id)]
        #返回json的响应
        # JsonResponse有将Python的字典转换为JSON数据
        # 使用HttpResponse实现：
        # HttpResponse(json.dumps(result), content_type='application/json')
    return JsonResponse(result)
